Meno prvku vymenovaneho typu

Otázka od: Jan Kostial

14. 10. 2004 11:13

Zdravim,

poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
za behu programu?

Mam napr. takyto typ:
TMyType = ( prvy_clen, druhy_clen, treti_clen );

Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
vratila dane meno prislusneho prvku.

Napr:
MenoPrvku := ReverseOrd( TMyType, 1 ); //vratilo by retazec 'druhy_clen'

funkcia GetEnumName() zda sa funguje len na triedy...  

Dik.

Lucky.



Odpovedá: Petr Brant

14. 10. 2004 11:32

Tohle IMHO nejde, ten nazev je jen mnemotechnicky a v dobe behu programu je
nahrazen cislem. Jedinou cestu vidim v tom, ze si zavedes konstantu

CMyType: array[TMyType] of string = ( 'prvy_clen', 'druhy_clen',
'treti_clen' );

a pak se budes odkazovat na CMyType[ordinalni_cislo_prvku]

Zdravim

RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz


poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
za behu programu?

Mam napr. takyto typ:
TMyType = ( prvy_clen, druhy_clen, treti_clen );

Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
vratila dane meno prislusneho prvku.

Napr:
MenoPrvku := ReverseOrd( TMyType, 1 ); //vratilo by retazec 'druhy_clen'


Odpovedá: Petr Vones

14. 10. 2004 12:34

From: "Jan Kostial" <lucky62@szm.sk>
> poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
> za behu programu?

uses
  TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
  A: TAlignment;
begin
  A := taCenter;
  S := GetEnumName(TypeInfo(TAlignment), Integer(A));
  ShowMessage(S);
end;

Petr Vones


Odpovedá: tondrej@t-online.de

14. 10. 2004 14:07

> poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
> za behu programu?
>
> Mam napr. takyto typ:
> TMyType = ( prvy_clen, druhy_clen, treti_clen );
>
> Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
> vratila dane meno prislusneho prvku.

Da sa to pomocou RTTI, v unite TypInfo je funkcia GetEnumName:

uses TypInfo;

var
   M: TMyType;
begin
   for M := Low(TMyType) to High(TMyType) do
     ShowMessage(GetEnumName(TypeInfo(TMyType), Ord(M)));
end;

HTH
TOndrej


Odpovedá: Jiri Bouchala

14. 10. 2004 14:06

Vse lze ziskat z RTTI za behu asi takto:
uses TypInfo;
type TMyType = ( prvy_clen, druhy_clen, treti_clen );
var OrdTypeInfo:PTypeInfo;
    EnumName:string;
begin
  OrdTypeInfo:=TypeInfo(TMyType);
  EnumName:=GetEnumName(OrdTypeInfo, 1); //viz priklad 'druhy_clen'
end;
JB



poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
za behu programu?

Mam napr. takyto typ:
TMyType = ( prvy_clen, druhy_clen, treti_clen );

Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
vratila dane meno prislusneho prvku.

Napr:
MenoPrvku := ReverseOrd( TMyType, 1 ); //vratilo by retazec 'druhy_clen'

funkcia GetEnumName() zda sa funguje len na triedy...  


Odpovedá: Jan Kostial

14. 10. 2004 14:40

GetEnumName by bolo perfektne,
bohuzial funkcia TypeInfo(TMyType) mi napise chybu:

Type TMyType has no type info.
Nepomohol ani prepinac {$M+}

> > poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
> > za behu programu?
> >
> > Mam napr. takyto typ:
> > TMyType = ( prvy_clen, druhy_clen, treti_clen );
> >
> > Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
> > vratila dane meno prislusneho prvku.
>
> Da sa to pomocou RTTI, v unite TypInfo je funkcia GetEnumName:
>
> uses TypInfo;
>
> var
> M: TMyType;
> begin
> for M := Low(TMyType) to High(TMyType) do
> ShowMessage(GetEnumName(TypeInfo(TMyType), Ord(M)));
> end;
>
> HTH
> TOndrej
>
>
>
>


Odpovedá: Ondrej Kelle

14. 10. 2004 14:50

> GetEnumName by bolo perfektne,
> bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
>
> Type TMyType has no type info.
> Nepomohol ani prepinac {$M+}

Zaujimave, o ktoru verziu Delphi sa jedna? V D7 to funguje bez akychkolvek
prepinacov.

V kazdom pripade, mozes kompilator Delphi prinutit, aby pre ten typ
vygeneroval RTTI tym, ze si nadeklarujes published property v pomocnej
triede:

type
  TDummy = class(TPersistent)
  private
    FDummy: TMyType;
  published
    property Dummy: TMyType read FMyType write FMyType;
  end;

Neskusal som to, ale snad to pomoze. Inak si asi budes musiet nadefinovat to
pole stringovych konstant, ako tu uz bolo spominane.

HTH
TOndrej


Odpovedá: Jan Kostial

14. 10. 2004 15:10

Mam D7. ???
Niekde na nete som cital, ze TypeInfo nefunguje na zaznamy (record).
Skusal to niekto na vlastnom vymenovanom type?

Lucky

> > GetEnumName by bolo perfektne,
> > bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
> >
> > Type TMyType has no type info.
> > Nepomohol ani prepinac {$M+}
>
> Zaujimave, o ktoru verziu Delphi sa jedna? V D7 to funguje bez akychkolvek
> prepinacov.
>
> V kazdom pripade, mozes kompilator Delphi prinutit, aby pre ten typ
> vygeneroval RTTI tym, ze si nadeklarujes published property v pomocnej
> triede:
>
> type
> TDummy = class(TPersistent)
> private
> FDummy: TMyType;
> published
> property Dummy: TMyType read FMyType write FMyType;
> end;
>
> Neskusal som to, ale snad to pomoze. Inak si asi budes musiet nadefinovat
to
> pole stringovych konstant, ako tu uz bolo spominane.
>
> HTH
> TOndrej


Odpovedá: Ondrej Kelle

14. 10. 2004 15:24

> Mam D7. ???
> Niekde na nete som cital, ze TypeInfo nefunguje na zaznamy (record).
> Skusal to niekto na vlastnom vymenovanom type?

Ten kod, co som poslal, tu u mna funguje. TMyType som pouzil z Tvojho
prispevku, bez zmeny. S record type to nema nic spolocne, je to enumerated
type.

HTH
TOndrej

Odpovedá: Karel Kral

18. 10. 2004 7:47

TypeInfo funguje pouze na properties, ke kterym existuje RTTI informace.
To jsou property uvedene v sekci published.

Jan Kostial napsal(a):
> GetEnumName by bolo perfektne,
> bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
>
> Type TMyType has no type info.
> Nepomohol ani prepinac {$M+}
>
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________


Odpovedá: Jan Kostial

18. 10. 2004 9:11

Moj typ TMyType ale nie je property ziadnej triedy.
Je to proste typ. Pomohlo by definovat ho vo vhodnej sekcii nejakej unit?

Lucky

> TypeInfo funguje pouze na properties, ke kterym existuje RTTI informace.
> To jsou property uvedene v sekci published.
>
> Jan Kostial napsal(a):
> > GetEnumName by bolo perfektne,
> > bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
> >
> > Type TMyType has no type info.
> > Nepomohol ani prepinac {$M+}
> >
> ______________________________________________________
> Karel Kral, vedouci odd. IT / IT manager
> Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
> Tel: 547 235 000, 602 552 432, Fax: 547 231 203
> E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
> ______________________________________________________
>
>
>
>